package com.wenwan.manage.impl;

import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Service;

import com.github.qcloudsms.SmsSingleSender;
import com.github.qcloudsms.SmsSingleSenderResult;
import com.wenwan.manage.mapper.RedisDao;
import com.wenwan.manage.pojo.Authentication;
import com.wenwan.manage.pojo.IdentityAuthentication;
import com.wenwan.manage.pojo.VerificationCode;
import com.wenwan.manage.pojo.VerificationCodeFrequency;
import com.wenwan.manage.service.PhoneService;
import com.wenwan.manage.setting.RegExpSetting;
import com.wenwan.manage.setting.SmsSetting;
import com.wenwan.manage.setting.StatusSetting;
import com.wenwan.manage.util.Util;

@Service
public class PhoneServiceImpl implements PhoneService {

	private RedisDao redisDao = new RedisDao();

	@Override
	public Map<String, Object> sendVerificationCode(String userId, String phone, String token) {
		// TODO Auto-generated method stub
		// DataToObject<Boolean> dto = new DataToObject<Boolean>();
		Map<String, Object> dto = new HashMap<String, Object>();

		if (userId != null && !userId.matches(RegExpSetting.PARA_ID)) {
			dto.put("data", false);
			dto.put("msg", "userId" + StatusSetting.MSG_10050_FORMAT_IS_MISTAKE);
			dto.put("code", StatusSetting.CODE_10050);
			// dto.setData(false);
			// dto.setMsg("userId" + StatusSetting.MSG_10050_FORMAT_IS_MISTAKE);
			// dto.setCode(StatusSetting.CODE_10050);
			return dto;
		}

		if (phone != null && !phone.matches(RegExpSetting.PHONE)) {
			dto.put("data", false);
			dto.put("msg", "phone" + StatusSetting.MSG_10050_FORMAT_IS_MISTAKE);
			dto.put("code", StatusSetting.CODE_10050);
			// dto.setData(false);
			// dto.setMsg("phone" + StatusSetting.MSG_10050_FORMAT_IS_MISTAKE);
			// dto.setCode(StatusSetting.CODE_10050);
			return dto;
		}

		if (token != null && !token.matches(RegExpSetting.PARA_ID)) {
			dto.put("data", false);
			dto.put("msg", "token" + StatusSetting.MSG_10050_FORMAT_IS_MISTAKE);
			dto.put("code", StatusSetting.CODE_10050);
			// dto.setCliData(false);
			// dto.setMsg("token" + StatusSetting.MSG_10050_FORMAT_IS_MISTAKE);
			// dto.setCode(StatusSetting.CODE_10050);
			return dto;
		}

		// 审核标记缓存对象
		IdentityAuthentication identityAuthentication = redisDao.getIdentityAuthentication(token);

		// 审核标记是否存在
		if (identityAuthentication == null) {
			dto.put("data", false);
			dto.put("msg", StatusSetting.MSG_10030_1);
			dto.put("code", StatusSetting.CODE_10030);
			// dto.setData(false);
			// dto.setMsg(StatusSetting.MSG_10030_1);
			// dto.setCode(StatusSetting.CODE_10030);
			return dto;
		}

		// 是否点击了开始
		if (!identityAuthentication.getIsStart()) {
			dto.put("data", false);
			dto.put("msg", StatusSetting.MSG_10030_2);
			dto.put("code", StatusSetting.CODE_10030);
			// dto.setData(false);
			// dto.setMsg(StatusSetting.MSG_10030_2);
			// dto.setCode(StatusSetting.CODE_10030);
			return dto;
		}

		// 验证短信
		// 获取验证码发送频率
		VerificationCodeFrequency verificationCodeFrequency = redisDao.getVerificationCodeFrequency(userId);
		if (verificationCodeFrequency != null) {
			dto.put("data", false);
			dto.put("msg", "获取验证码频率过高，请于" + verificationCodeFrequency.getTime() + "秒后再试");
			dto.put("code", StatusSetting.CODE_10030);
			// dto.setData(false);
			// dto.setMsg("获取验证码频率过高，请于" + verificationCodeFrequency.getTime() + "秒后再试");
			// dto.setCode(StatusSetting.CODE_10030);
			return dto;
		}

		// if (!identityAuthentication.getIsCheckIdCardFace()) {
		// dto.setData(false);
		// dto.setMsg("身份证正面未审核");
		// dto.setCode(StatusSetting.CODE_10030);
		// return dto;
		// }
		//
		// if (!identityAuthentication.getIsCheckIdCardFaceSuccess()) {
		// dto.setData(false);
		// dto.setMsg("身份证正面审核未通过，请重新审核身份证正面");
		// dto.setCode(StatusSetting.CODE_10030);
		// return dto;
		// }
		//
		// if (!identityAuthentication.getIsCheckOpposite()) {
		// dto.setData(false);
		// dto.setMsg("身份证背面未审核");
		// dto.setCode(StatusSetting.CODE_10030);
		// return dto;
		// }
		//
		// if (!identityAuthentication.getIsCheckOppositeSuccess()) {
		// dto.setData(false);
		// dto.setMsg("身份证背面审核未通过，请重新审核身份证正面");
		// dto.setCode(StatusSetting.CODE_10030);
		// return dto;
		// }
		//
		// if (!identityAuthentication.getIsFaceLiveDetectFour()) {
		// dto.setData(false);
		// dto.setMsg("人脸核身未审核，请先进行人脸核身");
		// dto.setCode(StatusSetting.CODE_10030);
		// return dto;
		// }
		//
		// if (!identityAuthentication.getIsFaceLiveDetectFourSuccess()) {
		// dto.setData(false);
		// dto.setMsg("人脸核身审核未通过，请重新进行人脸核身");
		// dto.setCode(StatusSetting.CODE_10030);
		// return dto;
		// }

		// 获取验证码
		String code = Util.getSixRandom();

		SmsSingleSenderResult singleSenderResult = getSmsSingleSenderResult(phone, code, "5");

		System.out.println(singleSenderResult);
		if (singleSenderResult.result == 0) {
			// 发送成功

			// 标记已获取验证码
			identityAuthentication.setIsGetVerificationCode(true);
			// 更新缓存
			redisDao.putIdentityAuthentication(identityAuthentication);
			// 保存验证码号
			createOrUpdateVerificationCode(userId, phone, code);

			// dto.setData(true);
			dto.put("data", true);
			dto.put("msg", StatusSetting.MSG_200);
			dto.put("code", StatusSetting.CODE_200);
			return dto;

		} else {
			dto.put("data", false);
			dto.put("msg", singleSenderResult.result + "");
			dto.put("code", singleSenderResult.errMsg);
			// dto.setData(false);
			// dto.setCode(singleSenderResult.result + "");
			// dto.setMsg(singleSenderResult.errMsg);
			return dto;
		}
		// return dto;
	}

	// @Autowired
	// private UserAuthenticationService userAuthenticationService;

	@Override
	public Map<String, Object> verificationPhone(String userId, String phone, String code, String token) {
		// TODO Auto-generated method stub
		// DataToObject<Boolean> dto = new DataToObject<Boolean>();
		Map<String, Object> dto = new HashMap<String, Object>();

		if (userId != null && !userId.matches(RegExpSetting.PARA_ID)) {
			dto.put("data", false);
			dto.put("msg", "userId" + StatusSetting.MSG_10050_FORMAT_IS_MISTAKE);
			dto.put("code", StatusSetting.CODE_10050);
			// dto.setData(false);
			// dto.setMsg("userId" + StatusSetting.MSG_10050_FORMAT_IS_MISTAKE);
			// dto.setCode(StatusSetting.CODE_10050);
			return dto;
		}

		if (phone != null && !phone.matches(RegExpSetting.PHONE)) {
			dto.put("data", false);
			dto.put("msg", "phone" + StatusSetting.MSG_10050_FORMAT_IS_MISTAKE);
			dto.put("code", StatusSetting.CODE_10050);
			// dto.setData(false);
			// dto.setMsg("phone" + StatusSetting.MSG_10050_FORMAT_IS_MISTAKE);
			// dto.setCode(StatusSetting.CODE_10050);
			return dto;
		}

		if (code != null && !code.matches(RegExpSetting.CODE)) {
			dto.put("data", false);
			dto.put("msg", "code" + StatusSetting.MSG_10050_FORMAT_IS_MISTAKE);
			dto.put("code", StatusSetting.CODE_10050);
			// dto.setData(false);
			// dto.setMsg("code" + StatusSetting.MSG_10050_FORMAT_IS_MISTAKE);
			// dto.setCode(StatusSetting.CODE_10050);
			return dto;
		}

		if (token != null && !token.matches(RegExpSetting.PARA_ID)) {
			dto.put("data", false);
			dto.put("msg", "token" + StatusSetting.MSG_10050_FORMAT_IS_MISTAKE);
			dto.put("code", StatusSetting.CODE_10050);
			// dto.setCliData(false);
			// dto.setMsg("token" + StatusSetting.MSG_10050_FORMAT_IS_MISTAKE);
			// dto.setCode(StatusSetting.CODE_10050);
			return dto;
		}

		// 审核标记缓存对象
		IdentityAuthentication identityAuthentication = redisDao.getIdentityAuthentication(token);

		// 审核标记是否存在
		if (identityAuthentication == null) {
			dto.put("data", false);
			dto.put("msg", StatusSetting.MSG_10030_1);
			dto.put("code", StatusSetting.CODE_10030);
			// dto.setData(false);
			// dto.setMsg(StatusSetting.MSG_10030_1);
			// dto.setCode(StatusSetting.CODE_10030);
			return dto;
		}

		if (!identityAuthentication.getIsStart()) {
			dto.put("data", false);
			dto.put("msg", StatusSetting.MSG_10030_2);
			dto.put("code", StatusSetting.CODE_10030);
			// dto.setData(false);
			// dto.setMsg(StatusSetting.MSG_10030_2);
			// dto.setCode(StatusSetting.CODE_10030);
			return dto;
		}

		// if (!identityAuthentication.getIsCheckIdCardFace()) {
		// dto.setData(false);
		// dto.setMsg("身份证正面未审核");
		// dto.setCode(StatusSetting.CODE_10030);
		// return dto;
		// }
		//
		// if (!identityAuthentication.getIsCheckIdCardFaceSuccess()) {
		// dto.setData(false);
		// dto.setMsg("身份证正面审核未通过，请重新审核身份证正面");
		// dto.setCode(StatusSetting.CODE_10030);
		// return dto;
		// }
		//
		// if (!identityAuthentication.getIsCheckOpposite()) {
		// dto.setData(false);
		// dto.setMsg("身份证背面未审核");
		// dto.setCode(StatusSetting.CODE_10030);
		// return dto;
		// }
		//
		// if (!identityAuthentication.getIsCheckOppositeSuccess()) {
		// dto.setData(false);
		// dto.setMsg("身份证背面审核未通过，请重新审核身份证正面");
		// dto.setCode(StatusSetting.CODE_10030);
		// return dto;
		// }
		//
		// if (!identityAuthentication.getIsFaceLiveDetectFour()) {
		// dto.setData(false);
		// dto.setMsg("人脸核身未审核，请先进行人脸核身");
		// dto.setCode(StatusSetting.CODE_10030);
		// return dto;
		// }
		//
		// if (!identityAuthentication.getIsFaceLiveDetectFourSuccess()) {
		// dto.setData(false);
		// dto.setMsg("人脸核身审核未通过，请重新进行人脸核身");
		// dto.setCode(StatusSetting.CODE_10030);
		// return dto;
		// }

		if (!identityAuthentication.getIsGetVerificationCode()) {
			dto.put("data", false);
			dto.put("msg", StatusSetting.MSG_10030_3);
			dto.put("code", StatusSetting.CODE_10030);
			// dto.setData(false);
			// dto.setMsg(StatusSetting.MSG_10030_3);
			// dto.setCode(StatusSetting.CODE_10030);
			return dto;
		}

		VerificationCode verificationCode = redisDao.getVerificationCode(userId);

		// dto.setData(true);
		dto.put("data", true);

		if (verificationCode != null) {

			if (!verificationCode.getIsUsed()) {

				if (!(code != null && code.equals(verificationCode.getCode()))) {

					dto.put("data", false);
					dto.put("msg", StatusSetting.MSG_10002);
					dto.put("code", StatusSetting.CODE_10002);
					// dto.setData(false);
					// dto.setCode(StatusSetting.CODE_10002);
					// dto.setMsg(StatusSetting.MSG_10002);
					return dto;

				} else {
					// 验证码通过。标记为已读
					verificationCode.setIsUsed(true);
					// 更新缓存
					redisDao.putVerificationCode(verificationCode);

					// 标记验证码验证成功
					identityAuthentication.setIsVerificationCodeSuccess(true);
					// 标记为已认证
					// identityAuthentication.setIsAuthentication(true);
					// 标记为认证成功
					// identityAuthentication.setIsAuthenticationSuccess(true);

					// *****更新认证信息
					// 获取认证信息
					Authentication authentication = identityAuthentication.getAuthentication();
					// 更新认证信息
					authentication.setPhone(phone);
					// 修改认证缓存
					identityAuthentication.setAuthentication(authentication);
					// 更新缓存
					redisDao.putIdentityAuthentication(identityAuthentication);
					// 同时更新数据库
					// Boolean data = userAuthenticationService.create(userId).getData();
					// dto.setData(true);
					dto.put("data", true);
					dto.put("msg", StatusSetting.MSG_200);
					dto.put("code", StatusSetting.CODE_200);
					return dto;

				}

			} else {

				dto.put("data", true);
				dto.put("msg", StatusSetting.MSG_10004);
				dto.put("code", StatusSetting.CODE_10004);
				// dto.setData(false);
				// dto.setCode(StatusSetting.CODE_10004);
				// dto.setMsg(StatusSetting.MSG_10004);
				return dto;
			}

		} else {

			dto.put("data", true);
			dto.put("msg", StatusSetting.MSG_10001);
			dto.put("code", StatusSetting.CODE_10001);
			// dto.setData(false);
			// dto.setCode(StatusSetting.CODE_10001);
			// dto.setMsg(StatusSetting.MSG_10001);
			return dto;
		}

	}

	private SmsSingleSenderResult getSmsSingleSenderResult(String phone, String code, String time) {
		// 初始化单发
		SmsSingleSender singleSender;
		SmsSingleSenderResult singleSenderResult = null;
		try {
			singleSender = new SmsSingleSender(SmsSetting.APPID, SmsSetting.APP_KEY);
			singleSenderResult = singleSender.send(0, SmsSetting.NATION_CODE, phone,
					SmsSetting.SDK_APPID_TPL_ID_98787.replaceFirst("CODE", code).replaceFirst("TIME", time), "", "");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return singleSenderResult;
	}

	// public static void main(String[] args) {
	// PhoneServiceImpl phoneServiceImpl = new PhoneServiceImpl();
	// phoneServiceImpl.getSmsSingleSenderResult("18977568679", "123456", "5");
	// }

	private Boolean createOrUpdateVerificationCode(String userId, String phone, String code) {
		// TODO Auto-generated method stub

		VerificationCode verificationCode = new VerificationCode();
		verificationCode.setId(userId);
		verificationCode.setPhone(phone);
		verificationCode.setCode(code);
		verificationCode.setIsUsed(false);
		verificationCode.setCreateTime(Util.getTime());
		verificationCode.setUpdateTime(Util.getTime());
		System.out.println(verificationCode);
		// 发送了短信验证码，更新缓存
		redisDao.putVerificationCode(verificationCode);

		VerificationCodeFrequency verificationCodeFrequency = new VerificationCodeFrequency();
		verificationCodeFrequency.setId(userId);
		verificationCodeFrequency.setPhone(phone);
		verificationCodeFrequency.setUserId(userId);

		// 更新缓存
		redisDao.putVerificationCodeFrequency(verificationCodeFrequency);

		return true;
	}

}
